package top.v5it.japi.plus.core;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.util.Set;

/**
 * 前缀配置
 *
 * @author zhanpu
 * @date 20-11-25
 */
public interface Japi {

    /**
     * 自定缓存信息前缀
     *
     * @return 缓存前缀
     */
    String getCachePrefix();

    /**
     * 自定义http头信息前缀
     *
     * @return 头前缀
     */
    String getHeadPrefix();

    /**
     * 获取系统中全局超时间
     *
     * @return 超时时间，单位毫秒
     */
    long getTimeout();

    /**
     * 验证是否快速失败
     *
     * @return true快速失败，false检验所有
     */
    boolean isFailFast();

    /**
     * 获取自定义异常类型
     *
     * @return 异常类信息
     */
    Set<String> getExceptionSet();

    /**
     * 认证类型
     * <pre>
     *     示例：
     *     authorization-type: SHA256-RSA2048
     *     authorization-type: HMAC-SHA256
     * </pre>
     *
     * @return 认证类型
     */
    String getAuthorizationType();

    /**
     * 加解密算法(Encryption and decryption algorithm)
     * <pre>
     *     示例：
     *     eada: RSA
     *     eada: AES
     * </pre>
     *
     * @return 加解密算法
     */
    Eada getEada();

    /**
     * 系统全局默认超时间
     *
     * @return 默认超时间，单位毫秒
     */
    default long defaultTimeout() {
        long timeout = getTimeout();
        return timeout == 0L ? 3000L : timeout;
    }

    /**
     * 加解密算法
     */
    enum Eada {

        /**
         * RSA加解密
         */
        RSA,

        /**
         * AES加解密
         */
        AES
    }

    /**
     * id生成类型
     */
    enum IdType {

        /**
         * redis生成id
         */
        redis,

        /**
         * 雪花算法生成id
         */
        snow
    }

    /**
     * http请求限流配置
     */
    enum Limit {

        /**
         * 计数法限流
         */
        count,

        /**
         * 滑动窗口限流
         */
        sliding_win
    }

    /**
     * 认证类型
     */
    @Getter
    @RequiredArgsConstructor
    enum AuthorizationType {

        /**
         * SHA256withRSA
         */
        SHA256_RSA2048("SHA256-RSA2048"),

        /**
         * HmacSHA256
         */
        HMAC_SHA256("HMAC-SHA256");

        /**
         * 值
         */
        private final String value;
    }
}
